# Specifické příkazy pro prostředí Google Colab
if 'google.colab' in str(get_ipython()):
import os, sys
os.chdir('/content')
# Stažení knihovny
! ls parlamentikon || git clone "https://github.com/parlamentikon/parlamentikon.git" --branch main
os.chdir('/content/parlamentikon/notebooks')
instalace_zavislosti = True
if instalace_zavislosti:
! pip install -r ../requirements.txt 1>/dev/null
instalace_knihovny = False
if instalace_knihovny:
! pip install .. 1>/dev/null
else:
# Přidání cesty pro lokální import knihovny
import sys, os
sys.path.insert(0, os.path.abspath('..'))
from datetime import datetime
import plotly.graph_objects as go
import pandas as pd
import numpy as np
from parlamentikon.Hlasovani import Hlasovani, ZpochybneniHlasovani
from nastav_notebook import nastav_pandas
# Data se budou pokaždé znovu stahovat z achivu PS
stahni=True
# Budeme analyzovat poslední volební období
zvolene_volebni_obdobi = None
# Načti souhrnné informace o hlasováních
h = Hlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
h.head(2)
2021-08-05:03:11:58 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-08-05:03:11:59 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'.
| id_hlasovani | id_organ | schuze | cislo | bod | cas | pro | proti | zdrzel | nehlasoval | ... | kvorum | nazev_dlouhy | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 67018 | 172 | 1 | 1 | 3 | 13:53:00 | 191 | 0 | 5 | 0 | ... | 99 | Inf. o ustavení volební komise PS a volbě členů | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | True | False |
| 1 | 67019 | 172 | 1 | 2 | 3 | 13:53:00 | 194 | 0 | 4 | 0 | ... | 100 | Inf. o ustavení volební komise PS a volbě členů | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | False | False |
2 rows × 21 columns
# Načti informace o zpochybnění hlasování
zph = ZpochybneniHlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
zph.head(2)
2021-08-05:03:12:03 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-08-05:03:12:04 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'.
| id_hlasovani | turn | mode | id_h2 | id_h3 | mode__KAT | je_platne | id_organ | schuze | cislo | ... | vysledek__ORIG | nazev_dlouhy | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 55680 | 67 | 0 | 55681 | 55682 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | <NA> | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN |
| 1 | 55664 | 43 | 0 | 55665 | 55666 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | <NA> | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN |
2 rows × 30 columns
volebni_obdobi = h.volebni_obdobi
print(f"Poslanecká sněmovna bude analyzovaná pro volební období {volebni_obdobi}.")
Poslanecká sněmovna bude analyzovaná pro volební období 2017.
def flatten(ary):
return [x for l in ary for x in l]
# Hlasování o zpochybnění hlasování je možné také zkazit nebo zpochybnit.
# Mezi prvním hlasováním o zpochybnění a opakovaným hlasováním může proběhnout několik dalších zpochybněných nebo neplatných hlasování.
def fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids(row):
if pd.isna(row['id_h2']):
return []
elif pd.isna(row['id_h3']):
return []
else:
return list(range(row['id_h2']+1, row['id_h3']))
zpochybneni = zph[zph.je_platne == True]
mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids = \
flatten(zpochybneni[zpochybneni.mode__KAT == 'žádost o opakování'].apply(fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids, axis=1))
hlasovani_o_zpochybneni_ids = h[h.id_hlasovani.isin(zpochybneni.id_h2.unique())]
hlasovani_bez_zmatecnych_a_zpochybnenych = h[~h.je_zmatecne
& ~h.id_hlasovani.isin(zph[zph.mode__KAT == 'žádost o opakování'].id_hlasovani)
& ~h.id_hlasovani.isin(mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids)
& ~h.id_hlasovani.isin(hlasovani_o_zpochybneni_ids)
]
h_platne = hlasovani_bez_zmatecnych_a_zpochybnenych.copy()
h_platne["mira_jednomyslnosti"] = (h_platne.pro - h_platne.proti).abs() / (h_platne.pro + h_platne.proti)
h_platne["mira_jednomyslnosti"].describe()
fig = go.Figure(go.Histogram(
x=h_platne.mira_jednomyslnosti,
hovertemplate="míra jednomyslnosti: %{x}<br>počet hlasování: %{y}<extra></extra>"))
fig.update_layout(width=700, height=400, xaxis=dict(title="míra jednomyslnosti"), yaxis=dict(title="počet hlasování"))
fig.show()
# denní míra jednomyslnosti
precision = 3
def A_razeno_dle_B(x, A, B):
df = x.groupby(A)[B].mean().sort_values(ascending=True)
return("<br>".join(map(str, df.index.astype(str) + ': ' + df.values.round(precision).astype(str))))
days = 7
interval = f"{days}D"
df = pd.DataFrame()
df['mira_jednomyslnosti_za_den_mean'] = h_platne.groupby(h_platne.datum.dt.date).mira_jednomyslnosti.mean()
df['nazev_dlouhy_za_den'] = h_platne.groupby(h_platne.datum.dt.date)[['nazev_dlouhy', 'mira_jednomyslnosti']].apply(
lambda x: A_razeno_dle_B(x, "nazev_dlouhy", "mira_jednomyslnosti")
)
df.index = pd.to_datetime(df.index)
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df.index,
y=df.mira_jednomyslnosti_za_den_mean,
text=df.nazev_dlouhy_za_den,
name="míra jednomyslnosti za den",
mode="markers",
marker=dict(
size=5,
color=df.mira_jednomyslnosti_za_den_mean,
colorscale='RdYlGn', # one of plotly colorscales
showscale=True
),
hovertemplate =
'<b>%{x}</b>'+
'<br><br><b>Průměrná míra jednomyslnosti</b>: <i>%{y:.3f}</i>'+
'<br><br><b>Hlasování dle míry jednomyslnosti (vzestupně):</b><br>%{text}<extra></extra>',
hoverlabel=dict(
bgcolor='white',
font=dict(color='black')
)
))
fig.update_layout(title="Denní míra jednomyslnosti", xaxis=dict(title="datum [jednotlivé dny]"), yaxis=dict(title="míra jednomyslnosti"))
fig.show()
print(f"Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): {h_platne[h_platne.mira_jednomyslnosti == 1].index.size}")
jednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 1].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(jednomyslna_temata.head(20))
Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): 3534
nazev_dlouhy
Pořad schůze 664
146
Návrh na vyslovení souhlasu PS s prodloužením doby nouzového stavu 83
Návrh na změny ve složení orgánů Poslanecké sněmovny 63
Návrhy Poslanecké sněmovny na propůjčení nebo udělení státních vyzname 60
Návrhy PS na propůjčení nebo udělení státních vyznamenání 44
Novela z. - občanský soudní řád 36
Vl.n.z. v souv.s elektronizací postupů orgánů veřejné moci 33
Novela z. - školský zákon 26
Novela z. - trestní řád 25
Novela z. o daních z příjmů 23
Novela z. o kompenzačním bonusu 23
Novela z. o státním rozpočtu ČR na rok 2020 22
Novela z. o státní sociální podpoře 20
Vl. n. z. kterým se mění některé zákony v oblasti daní - EU 20
Vl.n.z. o evidenci skutečných majitelů - EU 18
Novela z. o pomoci v hmotné nouzi 18
Novela ústav. z. - Ústava ČR 18
Usn.PS.1162 18
Novela z. o provozu na pozemních komunikacích 17
dtype: int64
print(f"Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): {h_platne[h_platne.mira_jednomyslnosti == 0].index.size}")
nejednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 0].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(nejednomyslna_temata.head(20))
Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): 77 nazev_dlouhy Novela z. o evidenci tržeb - EU 28 Pořad schůze 10 Vl.n.z. o kompenzačním bonusu v souv. s krizovými opatřeními 5 Vl.n.z.o opatř.ke zmírnění dopadů SARS CoV-2 na nájemce byt. 2 Novela z. - horní zákon 2 Návrh na vyslovení nedůvěry vládě České republiky 2 Novela z. o rozpočtových pravidlech 2 Vl.n.z. o státním rozpočtu ČR na rok 2021 2 Novela z. o pomoci v hmotné nouzi 1 Novela z. o potravinách a tabákových výrobcích - EU 1 Vln. z. o kompenzačním bonusu pro rok 2021 1 Novela z. o některých úpravách v oblasti evidence tržeb 1 Novela z. o vnitrozemské plavbě - EU 1 Novela z. o evidenci tržeb 1 Novela z. o důchodovém pojištění 1 Novela z. o bankách - EU 1 N.z., kterým se mění zák. opatření Senátu č. 340/2013 Sb. 1 Novela z. o státním občanství ČR 1 Novela z. úpravách ošetřovného 1 Novela z. o vodách (vodní zákon) - EU 1 dtype: int64
# Témata hlasování s nejvyšší mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).head(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Písemná interpelace I. Bartoše na A. Schillerovou ve věci zprávy o fin | 1 | 1.0 |
| Novela z. o odpovědnosti za přestupky | 1 | 1.0 |
| Návrh usnesení PS, kterým se stanoví způsob projednávání zpráv | 1 | 1.0 |
| Uctění památky obětí invaze a okupace v roce 1968 | 1 | 1.0 |
| Novela z. o některých opatřeních v oblasti kulturních akcí | 4 | 1.0 |
# Témata hlasování s nízkou mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).tail(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Písemná interpelace V. Munzara na A. Schillerovou | 1 | 0.083333 |
| 114. schůze | 2 | 0.070243 |
| Novela z. o evidenci tržeb - EU | 857 | 0.060626 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci poruš. ústav | 1 | 0.054054 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci odměňování ú | 1 | 0.038961 |
print(f"Poslední běh notebooku: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}.")
Poslední běh notebooku: 05.08.2021 03:12:10.